package com.microservices.yucloud.api.mongo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.Date;
import java.util.List;

/**
 * @author zy
 * @date 2019-08-20 17:50
 **/
public abstract class AbstractMongodbBaseDao<T> {

    @Autowired
    protected MongoTemplate mongoTemplate;

    /**
     * 获取需要操作的实体类class
     *
     * @return 对象bean
     */
    protected abstract Class<T> getEntityClass();

    /**
     * 通过条件查询,查询分页结果
     *
     * @param pageNo   页码
     * @param pageSize 每页数量
     * @param query    查询条件
     * @return 分页结果
     */
    public Pagination<T> getPage(int pageNo, int pageSize, Query query) {
        long totalCount = this.mongoTemplate.count(query, this.getEntityClass());
        Pagination<T> page = new Pagination<>(pageNo, pageSize, totalCount);
        // skip相当于从那条记录开始
        query.skip(page.getFirstResult());
        // 从skip开始,取多少条记录
        query.limit(pageSize);
        // 降序
        List<T> list = this.find(query);
        page.setDatas(list);
        page.setTotalCount(totalCount);
        return page;
    }

    /**
     * 通过条件查询实体(集合)
     *
     * @param query 查询条件
     * @return 查询结果
     */
    public List<T> find(Query query) {
        return mongoTemplate.find(query, this.getEntityClass());
    }

    /**
     * 通过一定的条件查询一个实体
     *
     * @param query 查询条件
     * @return 查询结果
     */
    public T findOne(Query query) {
        return mongoTemplate.findOne(query, this.getEntityClass());
    }

    /**
     * 查询出所有数据
     *
     * @return 查询结果
     */
    public List<T> findAll() {
        return this.mongoTemplate.findAll(getEntityClass());
    }

    /**
     * 查询并且修改记录
     *
     * @param query  查询条件
     * @param update 修改部分
     * @return 修改后结果
     */
    public T findAndModify(Query query, Update update) {
        update.set("lastModifyDate", new Date());
        return this.mongoTemplate.findAndModify(query, update, this.getEntityClass());
    }

    /**
     * 按条件查询,并且删除记录
     *
     * @param query 查询条件
     * @return 移除的记录
     */
    public T findAndRemove(Query query) {
        return this.mongoTemplate.findAndRemove(query, this.getEntityClass());
    }

    /**
     * 通过条件查询更新数据
     *
     * @param query  查询条件
     * @param update 修改内容
     */
    public void updateFirst(Query query, Update update) {
        mongoTemplate.updateFirst(query, update, this.getEntityClass());
    }

    /**
     * 保存一个对象到mongodb
     *
     * @param bean 需要保存的对象
     * @return 原对象
     */
    public T save(T bean) {
        mongoTemplate.save(bean);
        return bean;
    }

    /**
     * 通过ID获取记录
     *
     * @param id mongoId，即_id
     * @return 查询结果
     */
    public T findById(String id) {
        return mongoTemplate.findById(id, this.getEntityClass());
    }


    /**
     * 通过ID获取记录,并且指定了集合名
     *
     * @param id             mongoId, 即_id
     * @param collectionName 集合名
     * @return 查询结果
     */
    public T findById(String id, String collectionName) {
        return mongoTemplate.findById(id, this.getEntityClass(), collectionName);
    }
}
